package com.zndroid.utils.impl;

import android.Manifest;
import android.content.Context;
import android.content.res.AssetManager;
import android.os.Build;

import androidx.annotation.RequiresApi;
import androidx.annotation.RequiresPermission;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * Assert相关
 * 在 AssertManager 中不能处理单个超过1MB的文件，不然会报异常
 */
@SuppressWarnings("unused")
public class AssetsUtil {
    public String readFromAssets(Context context, String assetsFileName) {
        try {
            InputStream is = context.getAssets().open(assetsFileName);
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader bufReader = new BufferedReader(isr);
            String line;
            StringBuilder result = new StringBuilder();
            while ((line = bufReader.readLine()) != null) {
                result.append(line);
            }
            return result.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }
    /**
     * 拷贝Assets文件夹里的指定文件到指定文件
     * @param context      上下文
     * @param assetsFileName     源文件名
     * @param destFile     目标文件
     */
    public void copyFileFromAssets(Context context, String assetsFileName, File destFile) {
        try {
            InputStream is = context.getAssets().open(assetsFileName);
            FileOutputStream fos = new FileOutputStream(destFile);
            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
            fos.flush();    //刷新缓冲区
            is.close();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取assets目录下所有文件路径
     * @param context  上下文
     * @param assetsPath  文件地址
     * @return files[] 文件列表
     */
    public String[] getFilesFromAssets(Context context, String assetsPath){
        AssetManager assetManager = context.getAssets();
        String[] files = null;
        try {
            files = assetManager.list(assetsPath);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return files;
    }

    /**
     * 将assets下的文件或文件夹放到sd指定目录下
     * @param context      上下文
     * @param assetsPath   assets下的路径
     * @param sdCardPath   sd卡的路径
     */
    @RequiresApi(api = Build.VERSION_CODES.R)
    @RequiresPermission(anyOf = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.MANAGE_EXTERNAL_STORAGE})
    public void putAssetsToSDCard(Context context, String assetsPath, String sdCardPath){
        AssetManager assetManager = context.getAssets();
        try {
            String[] files = assetManager.list(assetsPath);
            if (files.length == 0) {
                // 说明assetsPath为空,或者assetsPath是一个文件
                InputStream is = assetManager.open(assetsPath);
                byte[] mByte = new byte[1024];
                int bt;
                File file = new File(sdCardPath + File.separator
                        + assetsPath.substring(assetsPath.lastIndexOf('/')));
                if (!file.exists()) {
                    // 创建文件
                    file.createNewFile();
                } else {
                    //已经存在直接退出
                    return;
                }

                // 写入流
                FileOutputStream fos = new FileOutputStream(file);
                // assets为文件,从文件中读取流
                while ((bt = is.read(mByte)) != -1) {
                    // 写入流到文件中
                    fos.write(mByte, 0, bt);
                }

                // 刷新缓冲区
                fos.flush();
                // 关闭读取流
                is.close();
                // 关闭写入流
                fos.close();
            } else {
                // 当mString长度大于0,说明其为文件夹
                sdCardPath = sdCardPath + File.separator + assetsPath;
                File file = new File(sdCardPath);
                if (!file.exists()) {
                    // 在sd下创建目录
                    file.mkdirs();
                }

                // 进行递归
                for (String stringFile : files) {
                    putAssetsToSDCard(context, assetsPath + File.separator
                            + stringFile, sdCardPath);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
